﻿/*
 * This is a .NET port of the Apache Chemistry QueryParser. http://chemistry.apache.org/
 * The conversion was performed by Brügmann Software GmbH. Programmer: Björn Kremer.
 *
 * This project is still under the original Apache License: 
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QueryParser
{
  using PropertyDefinition = CMISObjectModel.PropertyDefinitions.IPropertyDefinition;
	using TypeDefinition = CMISObjectModel.TypeDefinitions.TypeDefinition;

	public class ColumnReference : CmisSelector
	{

		private readonly string qualifier; // type qualifier coming from query statement
		private readonly string propQueryName; // property query name coming from query statement

		// The following fields are set when the types are resolved:
		private string propertyId;
		private TypeDefinition typeDef;

		public ColumnReference(string qualifier, string propQueryName)
		{
			this.qualifier = qualifier;
			this.propQueryName = propQueryName;
		}

		public ColumnReference(string propQueryName)
		{
			this.qualifier = null;
			this.propQueryName = propQueryName;
		}

		public virtual string Qualifier
		{
			get
			{
				return qualifier;
			}
		}

		/// @deprecated use <seealso cref="#getQualifier"/> instead. 
		[Obsolete("use getQualifier instead.")]
		public virtual string TypeQueryName
		{
			get
			{
				return Qualifier;
			}
		}

		public virtual string PropertyQueryName
		{
			get
			{
				return propQueryName;
			}
		}

		public override string Name
		{
			get
			{
				return propQueryName;
			}
		}

		public virtual void setTypeDefinition(string propertyId, TypeDefinition typeDef)
		{
			this.typeDef = typeDef;
			this.propertyId = propertyId;
		}

		public virtual TypeDefinition TypeDefinition
		{
			get
			{
				return typeDef;
			}
		}

      //public virtual PropertyDefinition PropertyDefinition
      //{
      //   get
      //   {
      //      return typeDef.PropertyDefinitions.get(PropertyId);
      //   }
      //}

		public virtual string PropertyId
		{
			get
			{
				return propertyId;
			}
		}

		public override string ToString()
		{
			return "ColumnReference(" + (qualifier == null ? "" : qualifier + ".") + propQueryName + (aliasName == null ? "" : " AS " + aliasName) + ")";
		}
	}
}
